Kong KonnectでKong GatewayをEC2にデプロイしLambdaを実行してみる

Kong KonnectでKong GatewayをEC2にデプロイしLambdaを実行してみる

クラスメソッド ゲーソル・ギョーソル Advent Calendar 2024の3日目のブログです。Kong Gatewayのプラグインを使用してLambdaを実行してみます。
Clock Icon2024.12.03

APIの管理を効率化したい えがわ です。

本ブログはゲーソル・ギョーソル Advent Calendar 2024の3日目のブログとなります。

今回はKong Konnectを使用してEC2にデプロイしたKong Gateway経由でLambdaを実行してみます。

Kongの説明は以下の記事をご確認ください。
https://dev.classmethod.jp/articles/kong-konnect-api-management/

構成図

今回の構成図はこちらです。
kong_lambda_plugin_14.png

EC2にKong Gatewayをデプロイし、プラグインを使用してLambdaを実行します。

環境

  • Kong Gateway 3.8
  • EC2: Amazon Linux 2023
  • Lambda: Python 3.13

やってみる

EC2の起動、接続方法については本筋ではないので割愛します。
パブリックサブネットに配置、IPアドレスの付与、そして、以下のセキュリティグループの設定が必要です。

セキュリティグループの設定

Kong GatewayはデフォルトではTCP8000を使用しますので、セキュリティグループのインバウンドルールを許可しておきます。

kong_lambda_plugin_15

他の機能を使用する場合はそのポートも許可する必要があります。
kong_lambda_plugin_02.png
こちらより抜粋

IAMロールを作成

EC2からLambdaを呼び出すため、EC2に付与するIAMロールを作成します。
IAMポリシーとしてはlambda:InvokeFunctionを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ExamplePolicy",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:{ACCOUNT_ID}:function:*"
        }
    ]
}

{ACCOUNT_ID}を置き換えてください。

作成したロールをEC2に設定します。

kong_lambda_plugin_06.png
kong_lambda_plugin_07.png

Lambdaを作成

Lambdaを作成していきます。
ランタイムはなんでもいいですが、今回はPython 3.13を使用します。

kong_lambda_plugin_08.png

コードはデフォルトのまま使用します。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Dockerを起動

EC2に接続しDockerを起動します。

# システムの更新
sudo dnf update -y

# Dockerのインストール
sudo dnf install docker -y

# Dockerサービスの起動
sudo systemctl start docker

# システム起動時にDockerを自動起動する設定
sudo systemctl enable docker

# 現在のユーザー(ec2-user)をdockerグループに追加
sudo usermod -aG docker ec2-user

# Dockerバージョンの確認
docker --version

Kong Gatewayを起動

KonnectからKong Gatewayを作成していきます。

Gateway Manager -> New Gatewayを押下します。

kong_lambda_plugin_03.png

Self-Managed Hybridを選択し、Nameを入力します。

kong_lambda_plugin_04.png

PlatformでLinux (Docker)を選択し、Generate Certificateを押下します。

kong_lambda_plugin_05.png

表示されたdocker runコマンドを実行します。
※文頭にsudoを付与する必要があります。

EC2でKong Gatewayを起動できました。

Routeを作成

Lambdaを実行するためのRouteを作成します。

Gateway Manager -> Routes -> + New RouteでRouteを作成します。

kong_lambda_plugin_09.png

Nameにはlambda, Pathsにも/lambdaを設定しSaveを押下します。

kong_lambda_plugin_10.png

Routeが作成できました。

Pluginの設定

Routeの画面からPluginsをクリックします。+ New Pluginを押下します。
検索窓にLambdaを入力し、AWS Lambdaプラグインを選択します。

kong_lambda_plugin_11.png

プラグインの設定画面が表示されるので、

View Advanced Parametersをクリックし、以下の設定を入力します。

項目名 設定値
AWS Region ap-northeast-1
Function Name kong-demo-lambda

kong_lambda_plugin_12.png

プラグインが設定できました。
kong_lambda_plugin_13.png

実行してみる

EC2のパブリックIPにリクエストしてみます。

egawa@HL01559:~$ curl -i http://{xxx.xxx.xxx.xxx}:8000/lambda
HTTP/1.1 200 OK
Content-Type: application/json
Connection: keep-alive
Via: 2 kong/3.8.0.0-enterprise-edition
X-Amz-Executed-Version: $LATEST
x-amzn-Remapped-Content-Length: 0
X-Amzn-Trace-Id: Root=1-674d5021-411b76555c2d1b3b58a153e5;Parent=4cce7f3c3accdcea;Sampled=0;Lineage=1:de65a904:0
X-Amz-Log-Result: U1RBUlQgUmVxdWVzdElkOiAwYjBiY2VjYy05ZmVkLTQwOTctYjViNy1kYjg2ZDEzZDhhOWMgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAwYjBiY2VjYy05ZmVkLTQwOTctYjViNy1kYjg2ZDEzZDhhOWMKUkVQT1JUIFJlcXVlc3RJZDogMGIwYmNlY2MtOWZlZC00MDk3LWI1YjctZGI4NmQxM2Q4YTljCUR1cmF0aW9uOiAxLjY5IG1zCUJpbGxlZCBEdXJhdGlvbjogMiBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogMzEgTUIJCg==
Date: Mon, 02 Dec 2024 06:13:53 GMT
x-amzn-RequestId: 0b0bcecc-9fed-4097-b5b7-db86d13d8a9c
Content-Length: 50
X-Kong-Response-Latency: 0
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 37206b5ee6baee6eb1878306e6d9445e

{"statusCode":200,"body":"\"Hello from Lambda!\""}

Lambdaを実行することができました。

さいごに

Kong GatewayからLambdaを実行する手順をまとめてみました。
AWSのサービスを使用してKong Gatewayを起動する場合、他のAWSサービスとの連携はシームレスに行えます。
キーやシークレットといった認証情報の管理は必要なく、ロールの管理で完結します。
この記事がどなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.